package com.datareport.config.datasource;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * 多数据源使用示例
 * 展示如何在实际业务中使用多数据源功能
 * 
 * @author datareport
 * @since 2024-01-01
 */
@Slf4j
@Service
public class MultiDataSourceExample {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private DataSourceUtil dataSourceUtil;

    /**
     * 使用方法调用方式切换数据源
     */
    public void manualDataSourceSwitching() {
        log.info("手动切换数据源示例");
        
        // 切换到业务数据库
        dataSourceUtil.switchToBusinessDB();
        List<Map<String, Object>> businessData = jdbcTemplate.queryForList("SELECT 'business_data' as type");
        log.info("业务数据: {}", businessData);
        
        // 切换到统计结果库
        dataSourceUtil.switchToStatisticsDB();
        List<Map<String, Object>> statisticsData = jdbcTemplate.queryForList("SELECT 'statistics_data' as type");
        log.info("统计数据: {}", statisticsData);
        
        // 切换到系统配置库
        dataSourceUtil.switchToSystemDB();
        List<Map<String, Object>> systemData = jdbcTemplate.queryForList("SELECT 'system_data' as type");
        log.info("系统数据: {}", systemData);
        
        // 清除数据源设置
        dataSourceUtil.clearDataSource();
    }

    /**
     * 使用回调方式切换数据源
     */
    public void callbackDataSourceSwitching() {
        log.info("回调方式切换数据源示例");
        
        // 在业务数据库中执行查询
        List<Map<String, Object>> businessResult = dataSourceUtil.executeWithDataSource(
            DataSourceContextHolder.DataSourceType.BUSINESS_DB,
            () -> jdbcTemplate.queryForList("SELECT 'business_callback' as type")
        );
        log.info("业务数据(回调): {}", businessResult);
        
        // 在统计结果库中执行查询
        List<Map<String, Object>> statisticsResult = dataSourceUtil.executeWithDataSource(
            DataSourceContextHolder.DataSourceType.STATISTICS_DB,
            () -> jdbcTemplate.queryForList("SELECT 'statistics_callback' as type")
        );
        log.info("统计数据(回调): {}", statisticsResult);
        
        // 在系统配置库中执行查询
        List<Map<String, Object>> systemResult = dataSourceUtil.executeWithDataSource(
            DataSourceContextHolder.DataSourceType.SYSTEM_DB,
            () -> jdbcTemplate.queryForList("SELECT 'system_callback' as type")
        );
        log.info("系统数据(回调): {}", systemResult);
    }

    /**
     * 混合使用注解和手动切换
     */
    public void mixedUsageExample() {
        log.info("注解方式 - 当前在业务数据库");
        
        // 在注解指定的数据源中执行操作
        List<Map<String, Object>> businessData = jdbcTemplate.queryForList("SELECT 'business_annotation' as type");
        log.info("注解方式业务数据: {}", businessData);
        
        // 临时切换到其他数据源
        dataSourceUtil.switchToStatisticsDB();
        List<Map<String, Object>> statisticsData = jdbcTemplate.queryForList("SELECT 'statistics_manual' as type");
        log.info("手动切换统计数据: {}", statisticsData);
        
        // 切换回注解指定的数据源
        dataSourceUtil.switchToBusinessDB();
        List<Map<String, Object>> businessData2 = jdbcTemplate.queryForList("SELECT 'business_annotation_2' as type");
        log.info("回到注解业务数据: {}", businessData2);
    }

    /**
     * 测试所有数据源连接
     */
    public void testAllDataSources() {
        log.info("测试所有数据源连接");
        
        for (DataSourceContextHolder.DataSourceType dataSourceType : DataSourceContextHolder.DataSourceType.values()) {
            try {
                switch (dataSourceType) {
                    case BUSINESS_DB:
                        dataSourceUtil.switchToBusinessDB();
                        break;
                    case STATISTICS_DB:
                        dataSourceUtil.switchToStatisticsDB();
                        break;
                    case SYSTEM_DB:
                        dataSourceUtil.switchToSystemDB();
                        break;
                }
                String result = jdbcTemplate.queryForObject("SELECT 'test' as result", String.class);
                log.info("数据源 {} 连接测试: 成功 - {}", dataSourceType.getCode(), result);
            } catch (Exception e) {
                log.error("数据源 {} 连接测试: 失败 - {}", dataSourceType.getCode(), e.getMessage());
            }
        }
        
        dataSourceUtil.clearDataSource();
    }
}